package com.sinog.biz.service.business.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mongodb.client.result.DeleteResult;
import com.sinog.biz.mapper.havexml.NoticeInfoManageMapper;
import com.sinog.biz.mapper.havexml.SystemCodeMapper;
import com.sinog.biz.mapper.havexml.UploadAppendixFileMapper;
import com.sinog.biz.service.business.NoticeInfoManageService;
import com.sinog.core.domain.NoticeInfoManage;
import com.sinog.core.model.NoticeInfo;
import com.sinog.core.model.UploadAppendixFile;
import com.sinog.core.util.JsonUtil;
import com.sinog.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - NoticeInfoManageServiceImpl
 * @author -
 * @date -
 */
@Slf4j
@Service
public class NoticeInfoManageServiceImpl implements NoticeInfoManageService {

    @Resource
    private NoticeInfoManageMapper noticeInfoManageMapper;
    @Resource
    private SystemCodeMapper systemCodeMapper;
    @Autowired
    @Qualifier("bujiJdbcTemplate")
    private JdbcTemplate bujiJdbcTemplate;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private UploadAppendixFileMapper uploadAppendixFileMapper;

    /**
     * 获取首页通知公告列表
     * @param departId departId
     * @param account account
     * @param level level
     * @return List<HashMap < String,Object>>
     */
    @Override
    public List<HashMap<String,Object>> getSyTzggList(String departId,String account,String level) {
        return noticeInfoManageMapper.selectSyTzggList(departId,account,level);
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - （新增/更新）
     * @param data data
     * @return boolean
     */
    @Override
    public boolean save(String data) {
        //将通知公告信息(主要是内容)信息,增加省标识存入MongoDB中
        //参数实体
        NoticeInfoManage noticeInfoManage = JsonUtil.toBean(data,NoticeInfoManage.class);
        if(StringUtils.isBlank(noticeInfoManage.getUpdateUser())){
            noticeInfoManage.setUpdateUser(noticeInfoManage.getCreateUser());
        }
        //数据库查询实体
        NoticeInfoManage noticeInfoManageDb = noticeInfoManage.selectById(noticeInfoManage.getId());
        if(ObjectUtils.isNotEmpty(noticeInfoManageDb)){
            noticeInfoManage.setCreateUser(null);
        }
        boolean flag = noticeInfoManage.insertOrUpdate();
        if(flag) {
            NoticeInfo noticeInfo = JsonUtil.toBean(data,NoticeInfo.class);
            //发布单位省份code
            String province = noticeInfo.getAddgovid().substring(0,2) + "0000";
            noticeInfo.setProvince(province);
            noticeInfo.setUpdateUser(noticeInfoManage.getUpdateUser());
            try {
                mongoTemplate.save(noticeInfo,"noticeInfo");
                return true;
            } catch(DataAccessResourceFailureException e) {
                log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
            } catch(RuntimeException e) {
                log.error("发生异常:{}",e.getMessage());
            }
        }
        return false;
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 获取有效期需要的下拉框数据
     * @param codeType codeType
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getNoticeType(String codeType) {
        return systemCodeMapper.getCodeIdAndName(codeType);
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 列表
     * @param searchKey searchKey
     * @param departId departId
     * @param startDate startDate
     * @param endDate endDate
     * @param effective effective
     * @param account account
     * @param pageIndex pageIndex
     * @param pageSize pageSize
     * @param level level
     * @return Page<Map<String,String>>
     */
    @Override
    public Page<Map<String,String>> getNoticeInfoList(String searchKey,String departId,String startDate,String endDate,
                                                      String effective,String account,Integer pageIndex,Integer pageSize,String level) {
        searchKey = StrUtil.converseToNull(searchKey);
        startDate = StrUtil.converseToNull(startDate);
        endDate = StrUtil.converseToNull(endDate);
        account = StrUtil.converseToNull(account);
        effective = StrUtil.converseToNull(effective);
        level = StrUtil.converseLevel(level);
        Page<Map<String,String>> page = new Page<>(pageIndex + 1,pageSize);
        return page.setRecords(noticeInfoManageMapper.getNoticeInfoList(page,searchKey,departId,startDate,endDate,effective,account,level));
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 根据ID和taskId查询upload_appendix_file
     * @param id id
     * @return List<UploadAppendixFile>
     */
    @Override
    public List<UploadAppendixFile> getFilesListdata(String id) {
        return uploadAppendixFileMapper.getFilesListdata(id);
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 删除
     * @param id id
     * @return boolean
     */
    @Override
    public boolean deleteNoticeInfo(String id) {
        NoticeInfoManage noticeInfoManage = new NoticeInfoManage();
        boolean flag = noticeInfoManage.deleteById(id);
        if(flag) {
            Query query = new Query(Criteria.where("_id").is(id));
            DeleteResult result1 = null;
            try {
                result1 = mongoTemplate.remove(query,NoticeInfo.class);
            } catch(DataAccessResourceFailureException e) {
                log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
            } catch(Exception e) {
                log.error("\nmongodb执行发生错误{}\n",e.getMessage());
            }
            assert result1 != null;
            return 0 < result1.getDeletedCount();
        }
        return false;
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 删除附件
     * @param id id
     * @return int
     */
    @Override
    public int deleteFjByid(String id) {
        return uploadAppendixFileMapper.deleteFjByid(id);
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 发布
     * @param id id
     * @return int
     */
    @Override
    public int announce(String id) {
        return noticeInfoManageMapper.announce(id);
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 取消发布
     * @param id id
     * @return int
     */
    @Override
    public int withdraw(String id) {
        return noticeInfoManageMapper.withdraw(id);
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - 获取部级附件信息
     * @param id id
     * @return List<UploadAppendixFile>
     */
    @Override
    public List<UploadAppendixFile> ifBujiFileExist(String id) {
        //自定义rowMapper
        RowMapper<UploadAppendixFile> rowMapper = new BeanPropertyRowMapper<>(UploadAppendixFile.class);
        try {
            return bujiJdbcTemplate.query("SELECT * FROM upload_appendix_file u WHERE u.id = ? AND task_id = '21'",rowMapper,id);
        } catch(DataAccessException e) {
            log.error("发生异常{}",e.getMessage());
            return new ArrayList<>(16);
        }
    }

    /**
     * 安帮工作资源管理 - 通知公告信息管理 - 通知公告信息管理 - mongo 获取通知公告信息
     * @param id id
     * @return NoticeInfo
     */
    @Override
    public NoticeInfo findTzggById(String id) {
        NoticeInfo noticeInfo = null;
        try {
            noticeInfo = mongoTemplate.findById(id,NoticeInfo.class);
        } catch(DataAccessResourceFailureException e) {
            log.error("\n>>>>>>>>>>>>>>>>>>>>>>>> mongodb服务器连接异常!!! <<<<<<<<<<<<<<<<<<<<<<<<<<");
        } catch(Exception e) {
            log.error("\nmongodb执行发生错误{}\n",e.getMessage());
        }
        return noticeInfo;
    }
}